package top.lixunda.ecommerce.server.good.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import top.lixunda.commerce.common.core.entity.MessageObject;
import top.lixunda.common.utils.ObjectValidators;
import top.lixunda.common.validate.XumValid;
import top.lixunda.ecommerce.server.business.BaseController;
import top.lixunda.ecommerce.server.business.api.entity.dto.PageConvertDTO;
import top.lixunda.ecommerce.server.good.api.entity.vo.GoodConvertVO;
import top.lixunda.ecommerce.server.good.api.entity.db.GoodDetailDO;
import top.lixunda.ecommerce.server.good.api.entity.db.GoodsDO;
import top.lixunda.ecommerce.server.good.api.controller.IGoodDetailController;
import top.lixunda.ecommerce.server.good.api.entity.dto.GoodDetailQueryDTO;
import top.lixunda.ecommerce.server.good.api.entity.dto.StoreRelatedProductDTO;
import top.lixunda.ecommerce.server.good.service.IGoodDetailService;

/**
 * @author Xumda
 * @version time:2020/1/10 14:01
 */
@Slf4j
@RestController
public class GoodDetailController
        extends BaseController implements IGoodDetailController {

    private final IGoodDetailService goodDetailService;

    @Autowired
    public GoodDetailController(IGoodDetailService goodDetailService) {
        this.goodDetailService = goodDetailService;
    }

    /**
     * 用户调用，根据id获取商品数据,只能查询普通用户可见的商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    @Override
    public MessageObject<GoodConvertVO> queryById(Integer id) {
        if (ObjectValidators.isEmpty(id)) {
            throw getAppException("参数id不能为空");
        }
        GoodConvertVO goodConvertVO = goodDetailService.queryById(id);
        if (goodConvertVO == null) {
            return getErrorMessageObject("商品数据不存在");
        }
        return getSuccessMessageObject("获取商品数据成功", goodConvertVO);
    }

    /**
     * 用户调用，根据条件筛选商品信息，只能查询普通用户可见的商品信息
     *
     * @param pageDTO 查询条件DTO, 包含查询条件，查询条件可以为空，为空时无条件进行查询
     * @return 商品列表
     */
    @Override
    public MessageObject<IPage<GoodConvertVO>> queryGoodDetailByPage(
            @XumValid PageConvertDTO<GoodsDO, GoodDetailDO, GoodDetailQueryDTO> pageDTO) {
        IPage<GoodConvertVO> page = goodDetailService.queryGoodDetailByPage(pageDTO);
        return getSuccessMessageObject("获取商品数据成功", page);
    }

    /**
     * 店家调用，根据id获取商品数据,只能查询本店铺的所有商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    @Override
    public MessageObject<GoodConvertVO> queryByIdStore(Integer id) {
        if (ObjectValidators.isEmpty(id)) {
            throw getAppException("参数id不能为空");
        }
        GoodConvertVO goodConvertVO = goodDetailService.queryByIdStore(id);
        if (goodConvertVO == null) {
            return getErrorMessageObject("商品数据不存在");
        }
        return getSuccessMessageObject("获取商品数据成功", goodConvertVO);
    }

    /**
     * 店家调用，根据条件筛选商品信息，只能查询本店铺的所有商品信息
     *
     * @param pageDTO 查询条件DTO, 包含查询条件，查询条件可以为空，为空时无条件进行查询
     * @return 商品列表
     */
    @Override
    public MessageObject<IPage<GoodConvertVO>> queryGoodDetailByPageStore(
            @XumValid PageConvertDTO<GoodsDO, GoodDetailDO, GoodDetailQueryDTO> pageDTO) {
        IPage<GoodConvertVO> page = goodDetailService.queryGoodDetailByPageStore(pageDTO);
        return getSuccessMessageObject("获取商品数据成功", page);
    }

    /**
     * 后台管理员调用，根据id获取商品数据,查询所有商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    @Override
    public MessageObject<GoodConvertVO> queryByIdAdmin(Integer id) {
        if (ObjectValidators.isEmpty(id)) {
            throw getAppException("参数id不能为空");
        }
        GoodConvertVO goodConvertVO = goodDetailService.queryByIdAdmin(id);
        if (goodConvertVO == null) {
            return getErrorMessageObject("商品数据不存在");
        }
        return getSuccessMessageObject("获取商品数据成功", goodConvertVO);
    }

    /**
     * 后台管理员调用，根据条件筛选商品信息，查询所有商品信息
     *
     * @param pageDTO 查询条件DTO, 包含查询条件，查询条件可以为空，为空时无条件进行查询
     * @return 商品列表
     */
    @Override
    public MessageObject<IPage<GoodConvertVO>> queryGoodDetailByPageAdmin(
            @XumValid PageConvertDTO<GoodsDO, GoodDetailDO, GoodDetailQueryDTO> pageDTO) {
        IPage<GoodConvertVO> page = goodDetailService.queryGoodDetailByPageAdmin(pageDTO);
        return getSuccessMessageObject("获取商品数据成功", page);
    }

    /**
     * 查询新商品，分页查询，不包含条件，用户端调用
     *
     * @param pageDTO 分页数据
     * @return 商品列表
     */
    @Override
    public MessageObject<IPage<GoodConvertVO>> queryNewProductsPage(
            @XumValid PageConvertDTO<GoodsDO, GoodDetailDO, ?> pageDTO) {
        IPage<GoodConvertVO> page = goodDetailService.queryNewProductsPage(pageDTO);
        return getSuccessMessageObject("获取数据成功", page);
    }

    /**
     * 查询某个店铺中的最新的商品的商品，用户端调用，不包含条件
     *
     * @param pageDTO 分页数据，不包含条件
     * @return 商品列表
     */
    @Override
    public MessageObject<IPage<GoodConvertVO>> queryStoreRelatedProductPage(
            @XumValid PageConvertDTO<GoodsDO, GoodDetailDO, StoreRelatedProductDTO> pageDTO) {
        IPage<GoodConvertVO> page = goodDetailService.queryStoreRelatedProductPage(pageDTO);
        return getSuccessMessageObject("获取数据成功", page);
    }

}
